const pt = require('puppeteer');

//爬取'推荐课程'
const base_url = 'https://yuedu.baidu.com/ebook/',
    url = [`${base_url}bf71335f700abb68a882fb12`,
           `${base_url}5f380d91f321dd36a32d7375a417866fb84ac01a`,
           `${base_url}115a7e1e793e0912a21614791711cc7931b778bc`,
           `${base_url}a12435eea9114431b90d6c85ec3a87c241288a4c`,
    ];

const data = [];

async function Crawler() {
    //linux环境下是要嵌套在try里面的
    try {
        //bs是browser浏览器的缩写， launch是发起启动的意思，pt启动一个浏览器
        const bs = await pt.launch(),
            pg = await bs.newPage();//bs启动一个新的页面

        for (var i = 0; i < url.length; i++) {
            //pg.goto(url,):用上面启动的新的页面去打开这个url
            await pg.goto(url[i], {
                timeout: 0,//超时时间,0表示无穷大，线上环境一定要给无穷大，puppeteer爬取数据失败了它自己会去走子进程的
                waitUntil: 'networkidle2'//waitUtil:什么时候代表完成了呢，没有向网络发起连接了就表示爬取完成了，'networkidle2'这个状态也可以表示完成了，它表示不超过两个连接，它是官方推荐的，还有一个'networkidle0'，表示没有任何连接
            });

            //打开页面了就可以开始评估页面了，evaluate:分析，评估，
            //记住：pg.evaluate里面那个函数的函数内部其实就是爬取的页面的环境，比如页面中有jQuery的环境，我
            //们也可以直接拿到来用
            const result = await pg.evaluate(function () {
                const $ = window.$,
                      $item = $('.doc-info-bd');

                const dataItem = {
                    bid: $item.find('.doc-info-img .doc-info-img').prop('src').match(/item\/(.*?)\.jpg/)[1],
                    href: $item.find('.doc-info-img .doc-info-img').prop('src'),
                    bookTitle: $item.find('.book-title').attr('title'),
                    readCount: parseInt($item.find('.doc-info-read-count').text()),
                    author: $item.find('.doc-info-author-link').text(),
                    price: $item.find('.doc-info-price .price-info .numeric').text().substr(1),
                    copyright: $item.find('.doc-info-field-val').text(),//版权
                    description: $('.book-intro-block .scaling-content p').text(),
                    imgKey: ''
                }

                return dataItem;
            });

            data.push(result);
        }

        await bs.close();//爬虫结束了之后，把浏览器关闭了

        process.send(data);//让进程发送消息，把result发过去，send发送出去之后，在进程里面是可以通过'message'这个事件监听到发送过来的数据的，结果交给回调函数的data

        setTimeout(() => {
            process.exit(0);//用完之后关闭进程
        }, 1000);
    } catch (error) {
        console.log(error);
    }
}

Crawler();



